# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
import pymysql
from itemadapter import ItemAdapter


class QiushiScrapy58Pipeline:
    """"专门用来处理Item类型对象的类"""
    fp = None
    # 重写父类的一个方法：该方法组织在开始时候被调用一次
    def open_spider(self, spider):
        print("开始爬虫.....")
        self.fp = open('./qiubai.csv',"w",encoding="utf-8")

    def process_item(self, item, spider):
        """该方法可以用来接收爬虫文件提交过来的item对象"""
        # 该方法：每接收到一个item就会被调用一次
        author = item['author']
        content = item['content']
        self.fp.write(author+':'+content)
        return item # 这个返回的item就会传递给下一个即将被执行的管道类
    def close_spider(self,spider):
        print("结束爬虫！")
        self.fp.close()

# 面试题：如何将数据一份保存到数据库 一份保存到本地文件： 在pipelines建立多个类
# 在管道文件中一个管道列对应将一组数据存储到一个平台或者软件的载体中
class mysqlPileLine(object):
    conn = None
    cursor = None
    def open_spider(self,spider):
        self.conn = pymysql.Connect(host="127.0.0.1",port=3306,user='root',password="mysql",db="qiubai",charset="utf8")
    def process_item(self,item,spider):
        self.cursor = self.conn.cursor()
        try:
            self.cursor.execute('insert into qiubai values("%s","%s")'%(item["author"],item["content"]))
            # 如果数据没有出现错误 进行事务提交
            self.conn.commit()
        except Exception as e:
            # 如果在存入数据库时候出现错误 输出异常 ，并进行事务回滚
            print(e)
            self.conn.rollback()
    def close_spider(self,spider):
        self.cursor.close()
        self.conn.close()

# 爬虫文件提交的item类型的对象最终会提交给哪一个管道类
# 会提交给第一个类
# 第二个类中的item 要由第一个传入item的管道类返回item